Codeforces Round #443 (Div. 2) C 位运算
Petya learned a new programming language CALPAS. A program in this language always takes one non-negative integer and returns one non-negative integer as well.
In the language, there are only three commands: apply a bitwise operation AND, OR or XOR with a given constant to the current integer. A program can contain an arbitrary sequence of these operations with arbitrary constants from 0 to 1023. When the program is run, all operations are applied (in the given order) to the argument and in the end the result integer is returned.
Petya wrote a program in this language, but it turned out to be too long. Write a program in CALPAS that does the same thing as the Petya's program, and consists of no more than 5 lines. Your program should return the same integer as Petya's program for all arguments from 0 to 1023.
The first line contains an integer n (1 ≤ n ≤ 5·105) — the number of lines.
Next n lines contain commands. A command consists of a character that represents the operation ("&", "|" or "^" for AND, OR or XOR respectively), and the constant xi 0 ≤ xi ≤ 1023.
Output an integer k (0 ≤ k ≤ 5) — the length of your program.
Next k lines must contain commands in the same format as in the input.
3
| 3
^ 2
| 1
2
| 3
^ 2
3
& 1
& 3
& 5
1
& 1
3
^ 1
^ 2
^ 3
0
You can read about bitwise operations in https://en.wikipedia.org/wiki/Bitwise_operation.
Second sample:
Let x be an input of the Petya's program. It's output is ((x&1)&3)&5 = x&(1&3&5) = x&1. So these two programs always give the same outputs.
思路:取x=0,y=1023(即两个互为取反数的数字)。将n次位运算操作后的x,y值,对比即可得到每一位数字进行的 操作。
代码:
1 #include<bits/stdc++.h> 2 #define db double 3 #include<vector> 4 #define ll long long 5 #define vec vector<ll> 6 #define Mt vector<vec> 7 #define ci(x) scanf("%d",&x) 8 #define cd(x) scanf("%lf",&x) 9 #define cl(x) scanf("%lld",&x) 10 #define pi(x) printf("%d\n",x) 11 #define pd(x) printf("%f\n",x) 12 #define pl(x) printf("%lld\n",x) 13 const int N = 1e6 + 5; 14 const int mod = 1e9 + 7; 15 const int MOD = mod - 1; 16 const db eps = 1e-18; 17 const db PI = acos(-1.0); 18 using namespace std; 19 bool cal(int a,int i){ 20 if(a&(1<<i)) return 1; 21 return 0; 22 } 23 int main(){ 24 int n;ci(n); 25 int x=0,y=1023; 26 while (n--) { 27 char c[2]; 28 int t; 29 scanf("%s %d", c, &t); 30 if (c[0] == '|') x|=t,y|=t; 31 if (c[0] == '&') x&=t,y&=t; 32 if (c[0] == '^') x^=t,y^=t; 33 } 34 /* 35 4种: 36 x:0,y:1. 37 x y:0011,0010,0111,0110 38 */ 39 int v1 = 0, v2 = 0, v3 = 0; 40 for (int i = 0; i < 10; i++) { 41 if(!cal(x,i)&&cal(y,i)) v2+=(1<<i);//0011: |0 &1 ^0 42 if(cal(x,i)&&cal(y,i)) v3+=(1<<i);//0111: |0 &0 ^1 43 if(cal(x,i)&&!cal(y,i)) v2+=(1<<i),v3+=(1<<i);//0110: |0 &1 ^1 44 } 45 printf("3\n"); 46 printf("| %d\n", v1); 47 printf("& %d\n", v2); 48 printf("^ %d\n", v3); 49 return 0; 50 }